# Урок 1. Настройка схем и процедур бизнес-процессов ## Задание 1. Создание элементарной схемы бизнес-процесса Создайте схему процесса с одним этапом согласования. Присоедините схему к типу объекта. Для выполнения задания необходимо: - Создать новую схему процесса (Управление бизнес-процессами -> Справочники -> Схема бизнес-процесса). Указать ее код и наименование, перейти в режим редактирования графической схемы. ![](img/openeditor.png) - Выделить дорожку «Инициатор» и выполнить появившуюся операцию добавления новой дорожки. ![](img/addtrack.png) - Выделить созданную дорожку, указать ей системное имя и наименование. На закладке «Настройки субъекта» создать строку и указать физ.лицо. В данном задании для упрощения предлагается выбрать конкретного сотрудника, в последующих заданиях будет осуществлена более сложная динамическая настройка субъекта. ![](img/addsubject.png) - Перетащить с панели инструментов на дорожку «Руководитель» блок с типом «Задание», назвать его. Выделив новый блок, выбрать операцию создания потоков и протянуть стрелку к этапу «Окончание процесса». Аналогичным образом направить поток из состояния «Начало процесса» в состояние «Согласование руководителем» ![](img/addblocak.png) - Выделить поток, ведущий от этапа согласования к окончанию процесса, и указать результат (кнопка, которую в своей задаче нажмет пользователь), требуемый для его активации. Отметить признак «Основной сценарий» на потоках, которые будут считаться умолчательными в случае корректного согласования. ![](img/addresult.png) - Выделить поток, ведущий начала процесса к этапу согласования, и указать шаблон задачи, которая будет направлена пользователю при активации потока и переходе в следующее состояние. Отметить признак «Основной сценарий». ![](img/addtask.png) - Завершить работу визуального редактора операцией «Выбор». - Перейти на закладку «Применяемость к типам документов» и выполнить операцию добавления. В открывшемся справочнике найти требуемый тип объекта. В детализации к типу объекта перейти на закладку «Документооборот» и убедиться в том, что существует строка с отмеченным признаком «Используется в ДО». Если такой строки нет, создать ее, отметить признак и применить изменения операцией «Сбросить кэш настройки». Подтвердить выбор типа объекта операцией «Выбор». ![](img/addobjtype.png) - Проверить схему операцией проверки. На выполнение операции в нижней части экрана появится лог проверки, в котором будет указано, корректно ли соединены состояния, для всех ли потоков указаны требуемые шаблоны задач и результаты. Изменить состояние версии на «Действующая» и сохранить изменения. ![](img/checkschema.png) - Чтобы пользователи могли видеть прогресс прохождения согласования документа, необходимо настроить отображение универсальной закладки «Маршруты». Для этого следует открыть справочник типов объектов (Настройки -> Настройки документации -> Типы объектов), найти требуемый. В разделе «Закладки типа объекта» найти закладку «Маршруты» и отметить ее активность. Сохранить изменения, применить изменения операцией «Сбросить кэш настройки». ![](img/addsection.png) - Для проверки открыть документ настроенного типа и запустить процесс документооборота по нему. - Для проверки маршрута следует последовательно выполнить все задачи по нему. Доступны два способа: - Авторизоваться в системе от имени пользователя-исполнителя, выполнить задачу, открыв список входящих задач через меню Сервис -> Входящие задачи. - Перейти в карточку задачи с закладки «Маршрут» и выполнить ее от своего имени, пользуясь привилегиями супер-пользователя. ## Задание 2. Настройка субъектов Создайте новую версию схемы, предусматривающую согласование также Центром ответственности и Финансовым управлением, согласующие сотрудники которых будут определяться автоматически. Реализуйте возможность отклонения каждой из согласующих инстанций. Для выполнения задания необходимо: - Создать новую версию схемы процесса, скопировав предыдущую. Ввести дату начала ее действия и описать изменения. Переключиться на редактирование новой версии. ![](img/newversion.png) - С помощью визуального редактора добавить новых субъектов, новые состояния и переходы. ![](img/hardschema.png) - Выделить субъект «Центр ответственности». На закладке «Настройки субъекта» создать строку и перейти в справочник профилей. Выбрать один из имеющихся профилей или создать новый и указать для него пользователей. В таком случае при активации состояния задачи по нему получат все пользователи, имеющие данный профиль. Если новый сотрудник получит данный профиль, он увидит и ранее направленные на него задачи. ![](img/profilesubject.png) - Выделить субъект «Финансовое управление». На закладке «Настройки субъекта» создать строку и выбрать ОФС из справочника. В таком случае при активации состояния задачи по нему получат все сотрудники, числящиеся в ОФС на момент отправки задач. ![](img/ofsubject.png) ## Задание 3. Настройка процедур для схемы бизнес-процесса Реализуйте автоматическую смену состояния документа при его согласовании и отклонении. Определите руководителя инициатора процедурой на основании атрибута «Заявитель» документа. Для выполнения задания необходимо: - Выделить этап «Согласование руководителем». Перейти на закладку «Процедуры» и создать новую запись в разделе «Процедуры после старта процесса». Перейти в справочник и создать новую процедуру. ![](img/newprocedure.png) - Указать код, наименование и содержание (см. следующий пункт) процедуры. Завершить создание процедуры кнопкой «Выбор», после чего в справочнике процедур появится только что созданная. Выбрать ее из справочника. ![](img/createprocedure.png) - Чтобы не писать процедуру с нуля, можно найти аналогичную и адаптировать ее под требуемый класс. Например, в системе уже доступна процедура «Перевод состояния лота». Для адаптации необходимо изменить в тексте процедуры все упоминания класса закупки (Prs_Lot) на Prs_Request: ```scala var idProc = Bpm_PrStateApi.getProcessId(idpPrState); var ropProc = Bpm_ProcessApi.load(idProc); var idDoc = Bpm_PrDocApi.getProcDocByPrState(idpPrState); var svState = param; var s = "select b.id from Prs_Lot b where b.gid ='"+idDoc+"'"; var l = sql(s).asList(); var idvClass = Prs_LotApi.idClass(); var idvClassState = Btk_ClassStateApi.findByNameAndIdClass(svState, idvClass, 0B); for (w:l) { var rop = Prs_LotApi.load(w.id); Prs_LotApi.setidState(rop, idvClassState); } ``` - Найти в справочнике типов объекта требуемый и зафиксировать системные имена используемых состояний для того, чтобы использовать их в качестве параметров. |Системное имя|Наименование| |-|-| |PRS_Annulled|Аннулировано| |PRS_Forming|Формируется| |PRS_Hold|Направлено| |Coordinating|Согласуется| |PRS_Confirmed|Утверждено| - Указать состояние «Согласуется» (Coordinating) как параметр для процедуры на этапе «Согласование руководителем». - Выделить этап «Документ согласован» и выбрать для него из справочника процедур только что созданную процедуру смены состояния. В качестве параметра указать состояние PRS_Confirmed. ![](img/doprocedure.png) - Аналогичным образом указать перевод состояния документа в «Аннулирован» при активации этапа «Документ отклонен». Далее будет описано заполнение субъекта «Руководитель подразделения» автоматически на основании атрибутов документа. Для этого необходимо: - Определить, на основании каких атрибутов документа определять пользователя. Документ содержит атрибут «Заявитель» — ссылка на ОФС. Запись ОФС содержит атрибут «Руководитель» — ссылка на требуемое физическое лицо. ![](img/findattr.png) - Написать SQL-запрос, который будет возвращать id физ.лица — получателя задачи — на основании gid исходной заявки на потребность: ``` select coalesce (p.iduser,0) as iduser from Prs_Request r join bs_ofstructure o on o.id = r.idofstructure join bs_employee e on e.id = o.idemployee join bs_person p on e.idperson=p.id where r.gid = '72951/1706' ``` - Найти аналогичную процедуру «Заполнение куратора договора»: ```scala var idProc = Bpm_PrStateApi.getProcessId(idpPrState); var svSubj = param; var idvDoc = Bpm_PrDocApi.getProcDocByPrState(idpPrState); var ropProc = Bpm_ProcessApi.load(idProc); var ropTargetOpt = Bpm_PrSubjectApi.getByPSSubject(ropProc, svSubj); var ropTarget = ropTargetOpt.get(); var s = `select coalesce (u.iduser,0) as iduser from cnt_contract r join bs_employee e on r.IDCURATOREMPLOYEE=e.id join bs_person u on e.idperson = u.id where r.gid = '` + idvDoc + `'`; var l = sql(s).asList(); for (w:l) { if (w.iduser == 0) {raise("Внимание! Для договора не указан куратор.");} Bpm_PrSubjUserApi.register(ropTarget, w.iduser, 0B, 0B); } ``` SQL запрос необходимо заменить на написанный ранее, чтобы получился следующий результат: ```scala var idProc = Bpm_PrStateApi.getProcessId(idpPrState); var svSubj = param; var idvDoc = Bpm_PrDocApi.getProcDocByPrState(idpPrState); var ropProc = Bpm_ProcessApi.load(idProc); var ropTargetOpt = Bpm_PrSubjectApi.getByPSSubject(ropProc, svSubj); var ropTarget = ropTargetOpt.get(); var s = `select coalesce (p.iduser,0) as iduser from Prs_Request r join bs_ofstructure o on o.id = r.idofstructure join bs_employee e on e.id = o.idemployee join bs_person p on e.idperson=p.id where r.gid = '` + idvDoc + `'`; var l = sql(s).asList(); for (w:l) { if (w.iduser == 0) {raise("Внимание! Не удалось найти руководителя ОФС-заявителя!");} Bpm_PrSubjUserApi.register(ropTarget, w.iduser, 0B, 0B); } ``` - Для состояния «Начало процесса» на закладке «Процедуры» создать строку, открыть справочник процедур, создать новую и вставить в нее JEXL-код. Подтвердить выбор. В качестве параметра для процедуры указать системное имя субъекта «Руководитель подразделения». ![](img/ownprocedure.png)